<?php

// 发立得信息发布系统房屋信息版(php+mysql) V1.0
// 演示地址: http://fang.chalide.cn
// 文件路径: sqls.php
// 文件大小: 5096 字节
// 最后修改时间: 2025-06-09 18:44:17
// 作者: yujianyue
// 邮件: 15058593138@qq.com
// 版权所有,保留发行权和署名权
/**
 * 本文件功能：数据库操作类
 * 版权声明：保留发行权和署名权
 * 作者信息：15058593138@qq.com
 */

class DB {
    private $conn;
    private static $instance;
    
    /**
     * 构造函数，初始化数据库连接
     */
    private function __construct() {
        $this->conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);
        if ($this->conn->connect_error) {
            die("数据库连接失败: " . $this->conn->connect_error);
        }
        $this->conn->set_charset(DB_CHARSET);
    }
    
    /**
     * 获取单例实例
     * @return DB 数据库操作类实例
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * 执行SQL查询
     * @param string $sql SQL语句
     * @return mysqli_result|bool 查询结果
     */
    public function query($sql) {
        return $this->conn->query($sql);
    }
    
    /**
     * 获取所有结果
     * @param string $sql SQL语句
     * @return array 查询结果数组
     */
    public function getAll($sql) {
        $result = $this->query($sql);
        $data = [];
        if ($result && $result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }
        }
        return $data;
    }
    
    /**
     * 获取单行结果
     * @param string $sql SQL语句
     * @return array|null 查询结果数组或null
     */
    public function getRow($sql) {
        $result = $this->query($sql);
        if ($result && $result->num_rows > 0) {
            return $result->fetch_assoc();
        }
        return null;
    }
    
    /**
     * 获取单个值
     * @param string $sql SQL语句
     * @return mixed 查询结果或null
     */
    public function getOne($sql) {
        $result = $this->query($sql);
        if ($result && $result->num_rows > 0) {
            $row = $result->fetch_row();
            return $row[0];
        }
        return null;
    }
    
    /**
     * 插入数据
     * @param string $table 表名
     * @param array $data 数据数组
     * @return int 插入的ID或0
     */
    public function insert($table, $data) {
        $fields = [];
        $values = [];
        
        foreach ($data as $field => $value) {
            $fields[] = "`$field`";
            $values[] = "'" . $this->conn->real_escape_string($value) . "'";
        }
        
        $sql = "INSERT INTO $table (" . implode(", ", $fields) . ") VALUES (" . implode(", ", $values) . ")";
        
        if ($this->conn->query($sql)) {
            return $this->conn->insert_id;
        }
        return 0;
    }
    
    /**
     * 更新数据
     * @param string $table 表名
     * @param array $data 数据数组
     * @param string $where 条件
     * @return int 影响的行数
     */
    public function update($table, $data, $where) {
        $sets = [];
        
        foreach ($data as $field => $value) {
            $sets[] = "`$field` = '" . $this->conn->real_escape_string($value) . "'";
        }
        
        $sql = "UPDATE $table SET " . implode(", ", $sets) . " WHERE $where";
        
        if ($this->conn->query($sql)) {
            return $this->conn->affected_rows;
        }
        return 0;
    }
    
    /**
     * 删除数据
     * @param string $table 表名
     * @param string $where 条件
     * @return int 影响的行数
     */
    public function delete($table, $where) {
        $sql = "DELETE FROM $table WHERE $where";
        
        if ($this->conn->query($sql)) {
            return $this->conn->affected_rows;
        }
        return 0;
    }
    
    /**
     * 获取记录总数
     * @param string $table 表名
     * @param string $where 条件
     * @return int 记录总数
     */
    public function count($table, $where = '') {
        $sql = "SELECT COUNT(*) FROM $table";
        if (!empty($where)) {
            $sql .= " WHERE $where";
        }
        return intval($this->getOne($sql));
    }
    
    /**
     * 转义字符串
     * @param string $str 要转义的字符串
     * @return string 转义后的字符串
     */
    public function escape($str) {
        return $this->conn->real_escape_string($str);
    }
    
    /**
     * 获取最后一次执行的SQL错误
     * @return string 错误信息
     */
    public function getError() {
        return $this->conn->error;
    }
    
    /**
     * 开始事务
     */
    public function beginTransaction() {
        $this->conn->autocommit(false);
    }
    
    /**
     * 提交事务
     */
    public function commit() {
        $this->conn->commit();
        $this->conn->autocommit(true);
    }
    
    /**
     * 回滚事务
     */
    public function rollback() {
        $this->conn->rollback();
        $this->conn->autocommit(true);
    }
    
    /**
     * 关闭数据库连接
     */
    public function close() {
        $this->conn->close();
    }
}
?>
